package validatorx

import (
	"gitee.com/youbeiwuhuan/taotao-tools4go/base-tools/enumx"
	"gitee.com/youbeiwuhuan/taotao-tools4go/base-tools/utils/anyx"
	ut "github.com/go-playground/universal-translator"
	"github.com/go-playground/validator/v10"
	"reflect"
)

// AddEnumValidate 扩展validate标签
func AddEnumValidate(v *validator.Validate) {
	//err := TRANS.Add(EnumValidTag, "值{0}不符合枚举{1}的定义,或不存在{2}枚举定义", true)
	//fmt.Println(err)
	// 1.自己注册 自定义获取json标签值的中文翻译
	_ = v.RegisterTranslation(enumx.EnumValidTag, TRANS, tranEnumRegis, tranEnumName)

	// 2. 注册校验规则
	v.RegisterValidation(enumx.EnumValidTag, func(fl validator.FieldLevel) bool {
		//标签样例 enum=AnimalsEnum  fl.Param() 就是标签参数，即 AnimalsEnum
		enumName := fl.Param()

		if ei, ok := enumx.GetEnum2(enumName); ok {
			// 字段值
			fval := fl.Field().Interface()
			if checkEnumVal(ei, fval) {
				return true
			} else {
				return false
			}

		} else {
			return false
		}
	})
}

func checkEnumVal(ei interface{}, fval any) bool {
	v := reflect.ValueOf(ei)
	for i, len := 0, v.NumField(); i < len; i++ { // 遍历所有字段
		field := v.Field(i) // 获取第i个字段的反射值对象
		//fmt.Printf("Field %d: %s = %v\n", i, v.Type().Field(i).Name, field.Interface()) // 打印字段名和值
		if fval == field.Interface() {
			return true
		}
	}

	return false
}

// 注册enum标签的翻译
func tranEnumRegis(ut ut.Translator) error {
	// {0} 占位符
	return ut.Add(enumx.EnumValidTag, "字段{0}值{1}不符合枚举{2}的定义,或不存在{3}枚举定义", true)
}

// enum翻译函数
func tranEnumName(ut ut.Translator, fe validator.FieldError) string {
	//t, _ := ut.T("email0", fe.Field())
	//return t

	// {0} {1}占位符 是下面ut.T()里可变参数的索引
	t, _ := ut.T(enumx.EnumValidTag, fe.Field(), anyx.ToString(fe.Value()), fe.Param(), fe.Param())
	return t
}
